#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 5;

// 快读函数：比cin快10倍以上，处理大输入无压力
inline ll read() {
    ll s = 0;
    char ch = getchar();
    while (ch < '0' || ch > '9') ch = getchar();
    while (ch >= '0' && ch <= '9') {
        s = s * 10 + ch - '0';
        ch = getchar();
    }
    return s;
}

ll ans[N];  // 存储最终序列，避免vector动态扩容开销

int main() {
    int n = read();
    int m = n / 2;
    ll lst = 0;  // 上一轮的a_{2i}（即a_prev）
    int c = 0;   // ans数组的下标指针
    bool possible = true;

    for (int i = 0; i < m && possible; ++i) {
        ll x = read();  // 当前处理的偶数位置元素x_2i
        ll j = 1;
        // 找到第一个j，使得j² > x（用于后续递减遍历约数）
        while (j * j <= x) j++;
        // 从j-1开始递减遍历，找x的约数d1
        bool found = false;
        for (j--; j >= 1; --j) {
            if (x % j != 0) continue;  // j不是x的约数，跳过
            ll d1 = j;
            ll d2 = x / d1;
            // 条件1：d2 > d1（保证a_{2i-1}为正）
            if (d2 <= d1) continue;
            // 条件2：d1和d2同奇偶（保证a_{2i-1}和a_{2i}是整数）
            if ((d1 & 1) != (d2 & 1)) continue;
            // 计算a_{2i-1}和a_{2i}
            ll a_odd = (d2 - d1) / 2;   // a_{2i-1}
            ll a_even = (d1 + d2) / 2;  // a_{2i}
            // 条件3：a_{2i-1} > lst（保证x_{2i-1}为正）
            if (a_odd > lst) {
                // 生成奇数位置元素x_{2i-1}和已知偶数位置元素x_{2i}
                ans[++c] = a_odd * a_odd - lst * lst;
                ans[++c] = a_even * a_even - a_odd * a_odd;
                lst = a_even;  // 更新lst为当前a_{2i}
                found = true;
                break;
            }
        }
        if (!found) possible = false;
    }

    if (!possible) {
        puts("No");
        return 0;
    }

    // 输出结果
    puts("Yes");
    for (int i = 1; i <= n; ++i) {
        printf("%lld ", ans[i]);
    }
    return 0;
}